From: Yann Gautier <yann.gautier@foss.st.com>
To: Ulf Hansson <ulf.hansson@linaro.org>,
Hans de Goede <hdegoede@redhat.com>
Cc: Arend van Spriel <aspriel@gmail.com>,
Franky Lin <franky.lin@broadcom.com>,
Hante Meuleman <hante.meuleman@broadcom.com>,
Kalle Valo <kvalo@kernel.org>, <linux-wireless@vger.kernel.org>,
<brcm80211-dev-list.pdl@broadcom.com>,
<SHA-cyfmac-dev-list@infineon.com>,
Christophe ROULLIER-SCND-02 <christophe.roullier@foss.st.com>
Subject: Re: [PATCH v2] wifi: brcmfmac: Fix SDIO suspend/resume regression
Date: Fri, 24 Mar 2023 09:12:11 +0100 [thread overview]
Message-ID: <d3dc26af-5f96-1f47-3e80-9f31eacd7345@foss.st.com> (raw)
In-Reply-To: <CAPDyKFpacDCKeoyoz86oB-esqTP05Aqd6FZvXvMSA5pmdjo+ow@mail.gmail.com>
On 3/23/23 15:33, Ulf Hansson wrote:
> + Yann, Christophe
>
Hi Ulf,
Thanks for the forward!
The patch only changes code under CONFIG_ACPI, which isn't enabled on
Arm platforms. So no impact for STM32MP1 on which we saw the first
issue, and for which you made the ("brcmfmac: Avoid keeping power to
SDIO card unless WOWL is used") patch.
Best regards,
Yann
> On Mon, 20 Mar 2023 at 13:22, Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> After commit 92cadedd9d5f ("brcmfmac: Avoid keeping power to SDIO card
>> unless WOWL is used"), the wifi adapter by default is turned off on suspend
>> and then re-probed on resume.
>>
>> In at least 2 model x86/acpi tablets with brcmfmac43430a1 wifi adapters,
>> the newly added re-probe on resume fails like this:
>>
>> brcmfmac: brcmf_sdio_bus_rxctl: resumed on timeout
>> ieee80211 phy1: brcmf_bus_started: failed: -110
>> ieee80211 phy1: brcmf_attach: dongle is not responding: err=-110
>> brcmfmac: brcmf_sdio_firmware_callback: brcmf_attach failed
>>
>> It seems this specific brcmfmac model does not like being reprobed without
>> it actually being turned off first.
>>
>> And the adapter is not being turned off during suspend because of
>> commit f0992ace680c ("brcmfmac: prohibit ACPI power management for brcmfmac
>> driver").
>>
>> Now that the driver is being reprobed on resume, the disabling of ACPI
>> pm is no longer necessary, except when WOWL is used (in which case there
>> is no-reprobe).
>>
>> Move the dis-/en-abling of ACPI pm to brcmf_sdio_wowl_config(), this fixes
>> the brcmfmac43430a1 suspend/resume regression and should help save some
>> power when suspended.
>>
>> This change means that the code now also may re-enable ACPI pm when WOWL
>> gets disabled. ACPI pm should only be re-enabled if it was enabled by
>> the ACPI core originally. Add a brcmf_sdiod_acpi_save_power_manageable()
>> to save the original state for this.
>>
>> This has been tested on the following devices:
>>
>> Asus T100TA brcmfmac43241b4-sdio
>> Acer Iconia One 7 B1-750 brcmfmac43340-sdio
>> Chuwi Hi8 brcmfmac43430a0-sdio
>> Chuwi Hi8 brcmfmac43430a1-sdio
>>
>> (the Asus T100TA is the device for which the prohibiting of ACPI pm
>> was originally added)
>>
>> Fixes: 92cadedd9d5f ("brcmfmac: Avoid keeping power to SDIO card unless WOWL is used")
>> Cc: Ulf Hansson <ulf.hansson@linaro.org>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>
> Seems reasonable to me, thanks for fixing this! Feel free to add:
>
> Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
>
> Kind regards
> Uffe
>
>> ---
>> Changes in v2:
>> - Drop no longer used "struct device *dev" local variable from
>> brcmf_ops_sdio_probe() - Reported-by: kernel test robot <lkp@intel.com>
>> ---
>> - Note this is a resend of v2 with Kalle Valo/s email address fixed
>> ---
>> .../broadcom/brcm80211/brcmfmac/bcmsdh.c | 36 +++++++++++++------
>> .../broadcom/brcm80211/brcmfmac/sdio.h | 2 ++
>> 2 files changed, 28 insertions(+), 10 deletions(-)
>>
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> index b7c918f241c9..65d4799a5658 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/bcmsdh.c
>> @@ -994,15 +994,34 @@ static const struct sdio_device_id brcmf_sdmmc_ids[] = {
>> MODULE_DEVICE_TABLE(sdio, brcmf_sdmmc_ids);
>>
>>
>> -static void brcmf_sdiod_acpi_set_power_manageable(struct device *dev,
>> - int val)
>> +static void brcmf_sdiod_acpi_save_power_manageable(struct brcmf_sdio_dev *sdiodev)
>> {
>> #if IS_ENABLED(CONFIG_ACPI)
>> struct acpi_device *adev;
>>
>> - adev = ACPI_COMPANION(dev);
>> + adev = ACPI_COMPANION(&sdiodev->func1->dev);
>> if (adev)
>> - adev->flags.power_manageable = 0;
>> + sdiodev->func1_power_manageable = adev->flags.power_manageable;
>> +
>> + adev = ACPI_COMPANION(&sdiodev->func2->dev);
>> + if (adev)
>> + sdiodev->func2_power_manageable = adev->flags.power_manageable;
>> +#endif
>> +}
>> +
>> +static void brcmf_sdiod_acpi_set_power_manageable(struct brcmf_sdio_dev *sdiodev,
>> + int enable)
>> +{
>> +#if IS_ENABLED(CONFIG_ACPI)
>> + struct acpi_device *adev;
>> +
>> + adev = ACPI_COMPANION(&sdiodev->func1->dev);
>> + if (adev)
>> + adev->flags.power_manageable = enable ? sdiodev->func1_power_manageable : 0;
>> +
>> + adev = ACPI_COMPANION(&sdiodev->func2->dev);
>> + if (adev)
>> + adev->flags.power_manageable = enable ? sdiodev->func2_power_manageable : 0;
>> #endif
>> }
>>
>> @@ -1012,7 +1031,6 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
>> int err;
>> struct brcmf_sdio_dev *sdiodev;
>> struct brcmf_bus *bus_if;
>> - struct device *dev;
>>
>> brcmf_dbg(SDIO, "Enter\n");
>> brcmf_dbg(SDIO, "Class=%x\n", func->class);
>> @@ -1020,14 +1038,9 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
>> brcmf_dbg(SDIO, "sdio device ID: 0x%04x\n", func->device);
>> brcmf_dbg(SDIO, "Function#: %d\n", func->num);
>>
>> - dev = &func->dev;
>> -
>> /* Set MMC_QUIRK_LENIENT_FN0 for this card */
>> func->card->quirks |= MMC_QUIRK_LENIENT_FN0;
>>
>> - /* prohibit ACPI power management for this device */
>> - brcmf_sdiod_acpi_set_power_manageable(dev, 0);
>> -
>> /* Consume func num 1 but dont do anything with it. */
>> if (func->num == 1)
>> return 0;
>> @@ -1059,6 +1072,7 @@ static int brcmf_ops_sdio_probe(struct sdio_func *func,
>> dev_set_drvdata(&sdiodev->func1->dev, bus_if);
>> sdiodev->dev = &sdiodev->func1->dev;
>>
>> + brcmf_sdiod_acpi_save_power_manageable(sdiodev);
>> brcmf_sdiod_change_state(sdiodev, BRCMF_SDIOD_DOWN);
>>
>> brcmf_dbg(SDIO, "F2 found, calling brcmf_sdiod_probe...\n");
>> @@ -1124,6 +1138,8 @@ void brcmf_sdio_wowl_config(struct device *dev, bool enabled)
>>
>> if (sdiodev->settings->bus.sdio.oob_irq_supported ||
>> pm_caps & MMC_PM_WAKE_SDIO_IRQ) {
>> + /* Stop ACPI from turning off the device when wowl is enabled */
>> + brcmf_sdiod_acpi_set_power_manageable(sdiodev, !enabled);
>> sdiodev->wowl_enabled = enabled;
>> brcmf_dbg(SDIO, "Configuring WOWL, enabled=%d\n", enabled);
>> return;
>> diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
>> index b76d34d36bde..0d18ed15b403 100644
>> --- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
>> +++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/sdio.h
>> @@ -188,6 +188,8 @@ struct brcmf_sdio_dev {
>> char nvram_name[BRCMF_FW_NAME_LEN];
>> char clm_name[BRCMF_FW_NAME_LEN];
>> bool wowl_enabled;
>> + bool func1_power_manageable;
>> + bool func2_power_manageable;
>> enum brcmf_sdiod_state state;
>> struct brcmf_sdiod_freezer *freezer;
>> const struct firmware *clm_fw;
>> --
>> 2.39.1
>>
next prev parent reply other threads:[~2023-03-24 8:13 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-20 12:22 [PATCH v2] wifi: brcmfmac: Fix SDIO suspend/resume regression Hans de Goede
2023-03-23 14:33 ` Ulf Hansson
2023-03-24 7:11 ` Kalle Valo
2023-03-24 7:43 ` Hans de Goede
2023-03-24 8:12 ` Yann Gautier [this message]
2023-03-31 15:00 ` Kalle Valo
-- strict thread matches above, loose matches on Subject: below --
2023-03-20 12:09 Hans de Goede
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=d3dc26af-5f96-1f47-3e80-9f31eacd7345@foss.st.com \
--to=yann.gautier@foss.st.com \
--cc=SHA-cyfmac-dev-list@infineon.com \
--cc=aspriel@gmail.com \
--cc=brcm80211-dev-list.pdl@broadcom.com \
--cc=christophe.roullier@foss.st.com \
--cc=franky.lin@broadcom.com \
--cc=hante.meuleman@broadcom.com \
--cc=hdegoede@redhat.com \
--cc=kvalo@kernel.org \
--cc=linux-wireless@vger.kernel.org \
--cc=ulf.hansson@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).