Re: [PATCH] surface: surface3_power: Fix battery readings on batteries with a serial no

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On 2/24/22 13:35, Maximilian Luz wrote:
> On 2/24/22 11:18, Hans de Goede 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>
> 
> Thanks for fixing this! This has been bugging us over at
> https://github.com/linux-surface/linux-surface/issues/608.
> 
> Reviewed-by: Maximilian Luz <luzmaximilian@xxxxxxxxx>

Thank you, I have merged this into the pdx86/review-hans and /fixes
branches now. I've also added a buglink to the commit message.

I'll also take a look at some of the other bugs from:

https://github.com/linux-surface/linux-surface/labels/D%3A%20Surface%203

when I can make some time for this.

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);
> 




[Index of Archives]     [Linux Kernel Development]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux