From mboxrd@z Thu Jan 1 00:00:00 1970 From: "xavier.gnata@gmail.com" Subject: Re: [PATCH 3/3] ACPI: Don't re-select SBS battery if it's already selected Date: Mon, 11 Aug 2014 13:14:44 +0200 Message-ID: <53E8A5A4.5000405@gmail.com> References: <1394576402-2910-1-git-send-email-matthew.garrett@nebula.com> <1394576402-2910-4-git-send-email-matthew.garrett@nebula.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Return-path: Received: from mail-wg0-f48.google.com ([74.125.82.48]:59614 "EHLO mail-wg0-f48.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750800AbaHKLOy (ORCPT ); Mon, 11 Aug 2014 07:14:54 -0400 In-Reply-To: Sender: linux-acpi-owner@vger.kernel.org List-Id: linux-acpi@vger.kernel.org To: Lan Tianyu , Matthew Garrett Cc: "linux-acpi@vger.kernel.org" , "linux-kernel@vger kernel org" , Len Brown , "Rafael J. Wysocki" On 14/03/2014 06:39, Lan Tianyu wrote: > 2014-03-12 6:20 GMT+08:00 Matthew Garrett : >> The existing SBS code explicitly sets the selected battery in the SBS >> manager regardless of whether the battery in question is already selected. >> This causes bus timeouts on Apple hardware. Check for this case and avoid >> it. >> > Hi Matthew: > This patch is to avoid a redundant battery select operation when > the battery is selected. But the symptom "bus timeouts" is a bus transaction > issue, right? Will this happen during other SBS write/read operations? Do we > need to increase the wait time of SMBUS transaction? Well, the patch does the job and is needed on a macbook air. What should we test to make it potentially better? > >> Signed-off-by: Matthew Garrett >> --- >> drivers/acpi/sbs.c | 18 +++++++++++++----- >> 1 file changed, 13 insertions(+), 5 deletions(-) >> >> diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c >> index dbd4849..c386505 100644 >> --- a/drivers/acpi/sbs.c >> +++ b/drivers/acpi/sbs.c >> @@ -470,17 +470,25 @@ static struct device_attribute alarm_attr = { >> static int acpi_battery_read(struct acpi_battery *battery) >> { >> int result = 0, saved_present = battery->present; >> - u16 state; >> + u16 state, selected, desired; >> >> if (battery->sbs->manager_present) { >> result = acpi_smbus_read(battery->sbs->hc, SMBUS_READ_WORD, >> ACPI_SBS_MANAGER, 0x01, (u8 *)&state); >> if (!result) >> battery->present = state & (1 << battery->id); >> - state &= 0x0fff; >> - state |= 1 << (battery->id + 12); >> - acpi_smbus_write(battery->sbs->hc, SMBUS_WRITE_WORD, >> - ACPI_SBS_MANAGER, 0x01, (u8 *)&state, 2); >> + /* >> + * Don't switch battery if the correct one is already selected >> + */ >> + selected = state & 0xf000; >> + desired = 1 << (battery->id + 12); >> + if (selected != desired) { >> + state &= 0x0fff; >> + state |= desired; >> + acpi_smbus_write(battery->sbs->hc, SMBUS_WRITE_WORD, >> + ACPI_SBS_MANAGER, 0x01, >> + (u8 *)&state, 2); >> + } >> } else if (battery->id == 0) >> battery->present = 1; >> if (result || !battery->present) >> -- >> 1.8.5.3 >> >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-acpi" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > >