Index: src/sys/dev/ic/pcf8584.c =================================================================== RCS file: /cvsroot/src/sys/dev/ic/pcf8584.c,v retrieving revision 1.11 diff -u -r1.11 pcf8584.c --- src/sys/dev/ic/pcf8584.c 20 Jan 2014 22:02:32 -0000 1.11 +++ src/sys/dev/ic/pcf8584.c 15 Dec 2015 07:57:05 -0000 @@ -175,14 +175,28 @@ if (sc->sc_master) pcfiic_choose_bus(sc, addr >> 7); - if (pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen) != 0) - return (1); - - if (len > 0) { - if (I2C_OP_WRITE_P(op)) - ret = pcfiic_xmit(sc, addr & 0x7f, buf, len); - else - ret = pcfiic_recv(sc, addr & 0x7f, buf, len); + /* + * If we are writing, write address, cmdbuf, buf. + * If we are reading, write address, cmdbuf, then read address, buf. + */ + if (I2C_OP_WRITE_P(op)) { + if (len > 0) { + uint8_t *tmp; + + tmp = malloc(cmdlen + len, M_DEVBUF, + flags & I2C_F_POLL ? M_NOWAIT : M_WAITOK); + if (tmp == NULL) + return (1); + memcpy(tmp, cmdbuf, cmdlen); + memcpy(tmp + cmdlen, buf, len); + ret = pcfiic_xmit(sc, addr & 0x7f, tmp, cmdlen + len); + free(tmp, M_DEVBUF); + } else + ret = pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen); + } else { + if (pcfiic_xmit(sc, addr & 0x7f, cmdbuf, cmdlen) != 0) + return (1); + ret = pcfiic_recv(sc, addr & 0x7f, buf, len); } return (ret); }