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);
}