diff options
author | Derrick Pallas <derrick@pallas.us> | 2020-03-18 14:54:48 -0700 |
---|---|---|
committer | Steve Markgraf <steve@steve-m.de> | 2020-03-18 23:51:46 +0100 |
commit | d794155ba65796a76cd0a436f9709f4601509320 (patch) | |
tree | 701de60b75d3f4507c9b393b1f8bdb2196c2e112 | |
parent | dc92af01bf82b5185986190e3cde3762565d2194 (diff) |
tuner_r82xx: fix short-write in r82xx_read
In r82xx_read, there is a 1-byte I2C write followed by the I2C read. If
this I2C write fails, r82xx_read correctly bails out but may return 0.
Callers that check whether (rc < 0) will assume that the buffer was written
when it has not been, e.g. in r82xx_set_tv_standard where
priv->fil_cal_code = data[4] & 0x0f;
consumes a garbage value for data[4].
This change resolves that issue by copying the error path from r82xx_write.
-rw-r--r-- | src/tuner_r82xx.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/src/tuner_r82xx.c b/src/tuner_r82xx.c index fe52bd9..997abd7 100644 --- a/src/tuner_r82xx.c +++ b/src/tuner_r82xx.c @@ -330,8 +330,14 @@ static int r82xx_read(struct r82xx_priv *priv, uint8_t reg, uint8_t *val, int le priv->buf[0] = reg; rc = rtlsdr_i2c_write_fn(priv->rtl_dev, priv->cfg->i2c_addr, priv->buf, 1); - if (rc < 1) - return rc; + + if (rc != 1) { + fprintf(stderr, "%s: i2c wr failed=%d reg=%02x len=%d\n", + __FUNCTION__, rc, reg, 1); + if (rc < 0) + return rc; + return -1; + } rc = rtlsdr_i2c_read_fn(priv->rtl_dev, priv->cfg->i2c_addr, p, len); |