lkml.org 
[lkml]   [2022]   [Jan]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.16 172/217] ath11k: Fix napi related hang
    Date
    From: Ben Greear <greearb@candelatech.com>

    [ Upstream commit d943fdad7589653065be0e20aadc6dff37725ed4 ]

    Similar to the same bug in ath10k, a napi disable w/out it being enabled
    will hang forever. I believe I saw this while trying rmmod after driver
    had some failure on startup. Fix it by keeping state on whether napi is
    enabled or not.

    And, remove un-used napi pointer in ath11k driver base struct.

    Signed-off-by: Ben Greear <greearb@candelatech.com>
    Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
    Link: https://lore.kernel.org/r/20200903195254.29379-1-greearb@candelatech.com
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/wireless/ath/ath11k/ahb.c | 12 +++++++++---
    drivers/net/wireless/ath/ath11k/core.h | 2 +-
    drivers/net/wireless/ath/ath11k/pci.c | 12 +++++++++---
    3 files changed, 19 insertions(+), 7 deletions(-)

    diff --git a/drivers/net/wireless/ath/ath11k/ahb.c b/drivers/net/wireless/ath/ath11k/ahb.c
    index 8c9c781afc3e5..b9939057b7baf 100644
    --- a/drivers/net/wireless/ath/ath11k/ahb.c
    +++ b/drivers/net/wireless/ath/ath11k/ahb.c
    @@ -175,8 +175,11 @@ static void __ath11k_ahb_ext_irq_disable(struct ath11k_base *ab)

    ath11k_ahb_ext_grp_disable(irq_grp);

    - napi_synchronize(&irq_grp->napi);
    - napi_disable(&irq_grp->napi);
    + if (irq_grp->napi_enabled) {
    + napi_synchronize(&irq_grp->napi);
    + napi_disable(&irq_grp->napi);
    + irq_grp->napi_enabled = false;
    + }
    }
    }

    @@ -300,7 +303,10 @@ static void ath11k_ahb_ext_irq_enable(struct ath11k_base *ab)
    for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
    struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];

    - napi_enable(&irq_grp->napi);
    + if (!irq_grp->napi_enabled) {
    + napi_enable(&irq_grp->napi);
    + irq_grp->napi_enabled = true;
    + }
    ath11k_ahb_ext_grp_enable(irq_grp);
    }
    }
    diff --git a/drivers/net/wireless/ath/ath11k/core.h b/drivers/net/wireless/ath/ath11k/core.h
    index 31d234a51c79b..62ceee363fea0 100644
    --- a/drivers/net/wireless/ath/ath11k/core.h
    +++ b/drivers/net/wireless/ath/ath11k/core.h
    @@ -136,6 +136,7 @@ struct ath11k_ext_irq_grp {
    u32 num_irq;
    u32 grp_id;
    u64 timestamp;
    + bool napi_enabled;
    struct napi_struct napi;
    struct net_device napi_ndev;
    };
    @@ -713,7 +714,6 @@ struct ath11k_base {
    u32 wlan_init_status;
    int irq_num[ATH11K_IRQ_NUM_MAX];
    struct ath11k_ext_irq_grp ext_irq_grp[ATH11K_EXT_IRQ_GRP_NUM_MAX];
    - struct napi_struct *napi;
    struct ath11k_targ_cap target_caps;
    u32 ext_service_bitmap[WMI_SERVICE_EXT_BM_SIZE];
    bool pdevs_macaddr_valid;
    diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c
    index 3d353e7c9d5c2..5a78a7cb65f5e 100644
    --- a/drivers/net/wireless/ath/ath11k/pci.c
    +++ b/drivers/net/wireless/ath/ath11k/pci.c
    @@ -634,8 +634,11 @@ static void __ath11k_pci_ext_irq_disable(struct ath11k_base *sc)

    ath11k_pci_ext_grp_disable(irq_grp);

    - napi_synchronize(&irq_grp->napi);
    - napi_disable(&irq_grp->napi);
    + if (irq_grp->napi_enabled) {
    + napi_synchronize(&irq_grp->napi);
    + napi_disable(&irq_grp->napi);
    + irq_grp->napi_enabled = false;
    + }
    }
    }

    @@ -654,7 +657,10 @@ static void ath11k_pci_ext_irq_enable(struct ath11k_base *ab)
    for (i = 0; i < ATH11K_EXT_IRQ_GRP_NUM_MAX; i++) {
    struct ath11k_ext_irq_grp *irq_grp = &ab->ext_irq_grp[i];

    - napi_enable(&irq_grp->napi);
    + if (!irq_grp->napi_enabled) {
    + napi_enable(&irq_grp->napi);
    + irq_grp->napi_enabled = true;
    + }
    ath11k_pci_ext_grp_enable(irq_grp);
    }
    }
    --
    2.34.1
    \
     
     \ /
      Last update: 2022-01-18 04:10    [W:4.066 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site