aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ichiic
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2019-11-03 21:14:08 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2019-11-03 21:14:08 +0000
commitbff27555820a5401bf7b13b9723afc6b2d47334e (patch)
tree7d4027d367d2834c04701e6fa67ad02390679e55 /sys/dev/ichiic
parent0eb21d1b6eadcc5a7089626609e13892481987be (diff)
Notes
Diffstat (limited to 'sys/dev/ichiic')
-rw-r--r--sys/dev/ichiic/ig4_iic.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/dev/ichiic/ig4_iic.c b/sys/dev/ichiic/ig4_iic.c
index 2df4db156741..e353cb98a144 100644
--- a/sys/dev/ichiic/ig4_iic.c
+++ b/sys/dev/ichiic/ig4_iic.c
@@ -471,6 +471,7 @@ ig4iic_write(ig4iic_softc_t *sc, uint8_t *buf, uint16_t len,
int sent = 0;
int burst, target;
int error;
+ bool lowat_set = false;
if (len == 0)
return (0);
@@ -479,6 +480,11 @@ ig4iic_write(ig4iic_softc_t *sc, uint8_t *buf, uint16_t len,
burst = sc->cfg.txfifo_depth -
(reg_read(sc, IG4_REG_TXFLR) & IG4_FIFOLVL_MASK);
target = MIN(sent + burst, (int)len);
+ /* Leave some data queued to maintain the hardware pipeline */
+ if (!lowat_set && target != len) {
+ lowat_set = true;
+ reg_write(sc, IG4_REG_TX_TL, IG4_FIFO_LOWAT);
+ }
while(sent < target) {
cmd = buf[sent];
if (repeated_start && sent == 0)
@@ -494,6 +500,8 @@ ig4iic_write(ig4iic_softc_t *sc, uint8_t *buf, uint16_t len,
break;
}
}
+ if (lowat_set)
+ reg_write(sc, IG4_REG_TX_TL, 0);
return (error);
}