aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ichiic
diff options
context:
space:
mode:
authorVladimir Kondratyev <wulf@FreeBSD.org>2019-11-03 21:03:07 +0000
committerVladimir Kondratyev <wulf@FreeBSD.org>2019-11-03 21:03:07 +0000
commit023c42edae8e8138b13139a5e1b518af830b250c (patch)
tree9dfab88465d5e804e59f2b862d1a5a40fb759389 /sys/dev/ichiic
parent6f0c4b8583c3a9a8a7bfa913983dd8803bcfc779 (diff)
Notes
Diffstat (limited to 'sys/dev/ichiic')
-rw-r--r--sys/dev/ichiic/ig4_iic.c30
1 files changed, 20 insertions, 10 deletions
diff --git a/sys/dev/ichiic/ig4_iic.c b/sys/dev/ichiic/ig4_iic.c
index 79bb0e7173c0..1b7832b36597 100644
--- a/sys/dev/ichiic/ig4_iic.c
+++ b/sys/dev/ichiic/ig4_iic.c
@@ -384,21 +384,31 @@ ig4iic_write(ig4iic_softc_t *sc, uint8_t *buf, uint16_t len,
bool repeated_start, bool stop)
{
uint32_t cmd;
- uint16_t i;
+ int sent = 0;
+ int burst, target;
int error;
if (len == 0)
return (0);
- cmd = repeated_start ? IG4_DATA_RESTART : 0;
- for (i = 0; i < len; i++) {
- error = wait_status(sc, IG4_STATUS_TX_NOTFULL);
- if (error)
- break;
- cmd |= buf[i];
- cmd |= stop && i == len - 1 ? IG4_DATA_STOP : 0;
- reg_write(sc, IG4_REG_DATA_CMD, cmd);
- cmd = 0;
+ while (sent < len) {
+ burst = sc->cfg.txfifo_depth -
+ (reg_read(sc, IG4_REG_TXFLR) & IG4_FIFOLVL_MASK);
+ target = MIN(sent + burst, (int)len);
+ while(sent < target) {
+ cmd = buf[sent];
+ if (repeated_start && sent == 0)
+ cmd |= IG4_DATA_RESTART;
+ if (stop && sent == len - 1)
+ cmd |= IG4_DATA_STOP;
+ reg_write(sc, IG4_REG_DATA_CMD, cmd);
+ sent++;
+ }
+ if (sent < len) {
+ error = wait_status(sc, IG4_STATUS_TX_EMPTY);
+ if (error)
+ break;
+ }
}
(void)reg_read(sc, IG4_REG_TX_ABRT_SOURCE);