diff options
| author | Vladimir Kondratyev <wulf@FreeBSD.org> | 2019-11-03 21:14:08 +0000 |
|---|---|---|
| committer | Vladimir Kondratyev <wulf@FreeBSD.org> | 2019-11-03 21:14:08 +0000 |
| commit | bff27555820a5401bf7b13b9723afc6b2d47334e (patch) | |
| tree | 7d4027d367d2834c04701e6fa67ad02390679e55 /sys/dev/ichiic | |
| parent | 0eb21d1b6eadcc5a7089626609e13892481987be (diff) | |
Notes
Diffstat (limited to 'sys/dev/ichiic')
| -rw-r--r-- | sys/dev/ichiic/ig4_iic.c | 8 |
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); } |
