smbmsg(8): slave address confusion?

Andriy Gapon avg at icyb.net.ua
Fri Nov 21 05:55:58 PST 2008


It seems that smbmsg is another victim in "Great SMBus Slave Address
Confusion" - there are two schools: one that think that slave address is
(addr >> 1) and there other thinks that slave address is (addr & ~0x1).
It seems that smb driver in FreeBSD takes the first approach, but smbmsg
is keen on the second.

smbmsg.c:
...
/*
 * The I2C specs say that all addresses below 16 and above or equal
 * 240 are reserved.  Address 0 is the global address, but we do not
 * care for this detail.
 */
#define MIN_I2C_ADDR    16
#define MAX_I2C_ADDR    240
.
.
.
static void
probe_i2c(void)
{
...
        for (addr = MIN_I2C_ADDR; addr < MAX_I2C_ADDR; addr += 2) {
...

And sample output on my machine (releng/7 amd64):
$ mbmsg -p
Probing for devices on /dev/smb0:
Device @0x44: rw
Device @0x50: rw
Device @0x52: rw
Device @0x80: rw
Device @0x88: w
Device @0xc4: rw
Device @0xd0: rw
Device @0xd2: rw

Now:

(0x44 << 1) & 0xff == (0xc4 << 1) & 0xff = 0x88 (looks like RTC)
(0x50 << 1) & 0xff == (0xd0 << 1) & 0xff = 0xa0 (well known SPD addr)
(0x52 << 1) & 0xff == (0xd2 << 1) & 0xff = 0xa4 (well known SPD addr)
(0x80 << 1) & 0xff = 0x0 (mentioned above "global address")
(0x88 << 1) & 0xff == MIN_I2C_ADDR = 0x10 (something weird)

I think that this demonstrates that FreeBSD smb driver expects slave
addresses in range 0x0-0x7f.

-- 
Andriy Gapon


More information about the freebsd-stable mailing list