linux-wireless.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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
>>


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