Changeset 44697


Ignore:
Timestamp:
2015-03-12T17:32:07+01:00 (3 years ago)
Author:
nbd
Message:

ath9k: fix a beacon enable handling bug

Backport of r44696

Signed-off-by: Felix Fietkau <nbd@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/barrier_breaker/package/kernel/mac80211/patches/300-pending_work.patch

    r43439 r44697  
     1commit 182a72b61971fc7120d6163b2077c06618c422a4 
     2Author: Felix Fietkau <nbd@openwrt.org> 
     3Date:   Thu Mar 12 17:10:50 2015 +0100 
     4 
     5    ath9k: fix tracking of enabled AP beacons 
     6     
     7    sc->nbcnvifs tracks assigned beacon slots, not enabled beacons. 
     8    Therefore, it cannot be used to decide if cur_conf->enable_beacon (bool) 
     9    should be updated, or if beacons have been enabled already. 
     10    With the current code (depending on the order of calls), beacons often 
     11    do not get enabled in an AP+STA setup. 
     12    To fix tracking of enabled beacons, convert cur_conf->enable_beacon to a 
     13    bitmask of enabled beacon slots. 
     14     
     15    Cc: stable@vger.kernel.org 
     16    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
     17 
    118commit 228ee4473b89118993c17ead26381c490c44f9fb 
    219Author: Felix Fietkau <nbd@openwrt.org> 
     
    35553572        default: 
    35563573                ath_err(common, "Invalid TX queue type: %u\n", type); 
     3574--- a/drivers/net/wireless/ath/ath9k/beacon.c 
     3575+++ b/drivers/net/wireless/ath/ath9k/beacon.c 
     3576@@ -223,12 +223,15 @@ void ath9k_beacon_remove_slot(struct ath 
     3577        struct ath_common *common = ath9k_hw_common(sc->sc_ah); 
     3578        struct ath_vif *avp = (void *)vif->drv_priv; 
     3579        struct ath_buf *bf = avp->av_bcbuf; 
     3580+       struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; 
     3581  
     3582        ath_dbg(common, CONFIG, "Removing interface at beacon slot: %d\n", 
     3583                avp->av_bslot); 
     3584  
     3585        tasklet_disable(&sc->bcon_tasklet); 
     3586  
     3587+       cur_conf->enable_beacon &= ~BIT(avp->av_bslot); 
     3588+ 
     3589        if (bf && bf->bf_mpdu) { 
     3590                struct sk_buff *skb = bf->bf_mpdu; 
     3591                dma_unmap_single(sc->dev, bf->bf_buf_addr, 
     3592@@ -503,8 +506,7 @@ static bool ath9k_allow_beacon_config(st 
     3593        struct ath_vif *avp = (void *)vif->drv_priv; 
     3594  
     3595        if (sc->sc_ah->opmode == NL80211_IFTYPE_AP) { 
     3596-               if ((vif->type != NL80211_IFTYPE_AP) || 
     3597-                   (sc->nbcnvifs > 1)) { 
     3598+               if (vif->type != NL80211_IFTYPE_AP) { 
     3599                        ath_dbg(common, CONFIG, 
     3600                                "An AP interface is already present !\n"); 
     3601                        return false; 
     3602@@ -567,6 +569,7 @@ void ath9k_beacon_config(struct ath_soft 
     3603        struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf; 
     3604         struct ath_hw *ah = sc->sc_ah; 
     3605         struct ath_common *common = ath9k_hw_common(ah); 
     3606+       struct ath_vif *avp = (void *)vif->drv_priv; 
     3607        unsigned long flags; 
     3608        bool skip_beacon = false; 
     3609  
     3610@@ -588,12 +591,14 @@ void ath9k_beacon_config(struct ath_soft 
     3611         * enabling/disabling SWBA. 
     3612         */ 
     3613        if (changed & BSS_CHANGED_BEACON_ENABLED) { 
     3614-               if (!bss_conf->enable_beacon && 
     3615-                   (sc->nbcnvifs <= 1)) { 
     3616-                       cur_conf->enable_beacon = false; 
     3617-               } else if (bss_conf->enable_beacon) { 
     3618-                       cur_conf->enable_beacon = true; 
     3619-                       ath9k_cache_beacon_config(sc, bss_conf); 
     3620+               bool enabled = cur_conf->enable_beacon; 
     3621+ 
     3622+               if (!bss_conf->enable_beacon) { 
     3623+                       cur_conf->enable_beacon &= ~BIT(avp->av_bslot); 
     3624+               } else { 
     3625+                       cur_conf->enable_beacon |= BIT(avp->av_bslot); 
     3626+                       if (!enabled) 
     3627+                               ath9k_cache_beacon_config(sc, bss_conf); 
     3628                } 
     3629        } 
     3630  
     3631--- a/drivers/net/wireless/ath/ath9k/common.h 
     3632+++ b/drivers/net/wireless/ath/ath9k/common.h 
     3633@@ -53,7 +53,7 @@ struct ath_beacon_config { 
     3634        u16 dtim_period; 
     3635        u16 bmiss_timeout; 
     3636        u8 dtim_count; 
     3637-       bool enable_beacon; 
     3638+       u8 enable_beacon; 
     3639        bool ibss_creator; 
     3640        u32 nexttbtt; 
     3641        u32 intval; 
Note: See TracChangeset for help on using the changeset viewer.