On Thu, Feb 24, 2022 at 11:57 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > > Hi, > > On 2/24/22 11:55, Benjamin Tissoires wrote: > > On Thu, Feb 24, 2022 at 11:19 AM Hans de Goede <hdegoede@xxxxxxxxxx> wrote: > >> > >> The battery on the 2nd hand Surface 3 which I recently bought appears to > >> not have a serial no programmed in. This results in any I2C reads from > >> the registers containing the serial no failing with an I2C NACK. > >> > >> This was causing mshw0011_bix() to fail causing the battery readings to > >> not work at all. > >> > >> Ignore EREMOTEIO (I2C NACK) errors when retrieving the serial no and > >> continue with an empty serial no to fix this. > >> > >> Fixes: b1f81b496b0d ("platform/x86: surface3_power: MSHW0011 rev-eng implementation") > >> Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx> > > > > LGTM, (and scratching this off my list): > > Ah, so I guess this was already a known issue also hit by others ? > > Do you have a buglink which I can add to the commit message ? Oh, no, sorry. The email popped up, and instead of adding it at the end of the TODO list, I spent a few minutes checking it and answering. Sorry for the confusion. The problem in itself is entirely new to me. Cheers, Benjamin > > > > Reviewed-by: Benjamin Tissoires <benjamin.tissoires@xxxxxxxxxx> > > Thanks. > > Regards, > > Hans > > > >> --- > >> drivers/platform/surface/surface3_power.c | 13 ++++++++++--- > >> 1 file changed, 10 insertions(+), 3 deletions(-) > >> > >> diff --git a/drivers/platform/surface/surface3_power.c b/drivers/platform/surface/surface3_power.c > >> index abac3eec565e..b283bc9bb5fd 100644 > >> --- a/drivers/platform/surface/surface3_power.c > >> +++ b/drivers/platform/surface/surface3_power.c > >> @@ -232,14 +232,21 @@ static int mshw0011_bix(struct mshw0011_data *cdata, struct bix *bix) > >> } > >> bix->last_full_charg_capacity = ret; > >> > >> - /* get serial number */ > >> + /* > >> + * get serial number, on some devices (with unofficial replacement > >> + * battery?) reading any of the serial no range addresses gets nacked > >> + * in this case just leave the serial no empty. > >> + */ > >> ret = i2c_smbus_read_i2c_block_data(client, MSHW0011_BAT0_REG_SERIAL_NO, > >> sizeof(buf), buf); > >> - if (ret != sizeof(buf)) { > >> + if (ret == -EREMOTEIO) { > >> + /* no serial number available */ > >> + } else if (ret != sizeof(buf)) { > >> dev_err(&client->dev, "Error reading serial no: %d\n", ret); > >> return ret; > >> + } else { > >> + snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, buf); > >> } > >> - snprintf(bix->serial, ARRAY_SIZE(bix->serial), "%3pE%6pE", buf + 7, buf); > >> > >> /* get cycle count */ > >> ret = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_CYCLE_CNT); > >> -- > >> 2.35.1 > >> > > >