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