lkml.org 
[lkml]   [2022]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.16 0689/1039] 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(-)

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

    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(st
    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);
    }
    }
    --- a/drivers/net/wireless/ath/ath11k/core.h
    +++ b/drivers/net/wireless/ath/ath11k/core.h
    @@ -141,6 +141,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;
    };
    @@ -718,7 +719,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;
    --- a/drivers/net/wireless/ath/ath11k/pci.c
    +++ b/drivers/net/wireless/ath/ath11k/pci.c
    @@ -638,8 +638,11 @@ static void __ath11k_pci_ext_irq_disable

    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;
    + }
    }
    }

    @@ -658,7 +661,10 @@ static void ath11k_pci_ext_irq_enable(st
    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);
    }
    }

    \
     
     \ /
      Last update: 2022-01-24 23:40    [W:4.028 / U:0.312 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site