lkml.org 
[lkml]   [2021]   [Nov]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 121/179] net: ipa: directly disable ipa-setup-ready interrupt
    Date
    From: Alex Elder <elder@linaro.org>

    [ Upstream commit 33a153100bb3459479bd95d3259c2915b53fefa8 ]

    We currently maintain a "disabled" Boolean flag to determine whether
    the "ipa-setup-ready" SMP2P IRQ handler does anything. That flag
    must be accessed under protection of a mutex.

    Instead, disable the SMP2P interrupt when requested, which prevents
    the interrupt handler from ever being called. More importantly, it
    synchronizes a thread disabling the interrupt with the completion of
    the interrupt handler in case they run concurrently.

    Use the IPA setup_complete flag rather than the disabled flag in the
    handler to determine whether to ignore any interrupts arriving after
    the first.

    Rename the "disabled" flag to be "setup_disabled", to be specific
    about its purpose.

    Fixes: 530f9216a953 ("soc: qcom: ipa: AP/modem communications")
    Signed-off-by: Alex Elder <elder@linaro.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ipa/ipa_smp2p.c | 19 +++++++++----------
    1 file changed, 9 insertions(+), 10 deletions(-)

    diff --git a/drivers/net/ipa/ipa_smp2p.c b/drivers/net/ipa/ipa_smp2p.c
    index df7639c39d716..24bc112a072c6 100644
    --- a/drivers/net/ipa/ipa_smp2p.c
    +++ b/drivers/net/ipa/ipa_smp2p.c
    @@ -53,7 +53,7 @@
    * @setup_ready_irq: IPA interrupt triggered by modem to signal GSI ready
    * @power_on: Whether IPA power is on
    * @notified: Whether modem has been notified of power state
    - * @disabled: Whether setup ready interrupt handling is disabled
    + * @setup_disabled: Whether setup ready interrupt handler is disabled
    * @mutex: Mutex protecting ready-interrupt/shutdown interlock
    * @panic_notifier: Panic notifier structure
    */
    @@ -67,7 +67,7 @@ struct ipa_smp2p {
    u32 setup_ready_irq;
    bool power_on;
    bool notified;
    - bool disabled;
    + bool setup_disabled;
    struct mutex mutex;
    struct notifier_block panic_notifier;
    };
    @@ -155,11 +155,9 @@ static irqreturn_t ipa_smp2p_modem_setup_ready_isr(int irq, void *dev_id)
    struct device *dev;
    int ret;

    - mutex_lock(&smp2p->mutex);
    -
    - if (smp2p->disabled)
    - goto out_mutex_unlock;
    - smp2p->disabled = true; /* If any others arrive, ignore them */
    + /* Ignore any (spurious) interrupts received after the first */
    + if (smp2p->ipa->setup_complete)
    + return IRQ_HANDLED;

    /* Power needs to be active for setup */
    dev = &smp2p->ipa->pdev->dev;
    @@ -176,8 +174,6 @@ static irqreturn_t ipa_smp2p_modem_setup_ready_isr(int irq, void *dev_id)
    out_power_put:
    pm_runtime_mark_last_busy(dev);
    (void)pm_runtime_put_autosuspend(dev);
    -out_mutex_unlock:
    - mutex_unlock(&smp2p->mutex);

    return IRQ_HANDLED;
    }
    @@ -322,7 +318,10 @@ void ipa_smp2p_disable(struct ipa *ipa)

    mutex_lock(&smp2p->mutex);

    - smp2p->disabled = true;
    + if (!smp2p->setup_disabled) {
    + disable_irq(smp2p->setup_ready_irq);
    + smp2p->setup_disabled = true;
    + }

    mutex_unlock(&smp2p->mutex);
    }
    --
    2.33.0


    \
     
     \ /
      Last update: 2021-11-29 23:56    [W:4.329 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site