ath9k: Fix interface accounting
authorSujith Manoharan <c_manoha@qca.qualcomm.com>
Fri, 5 Sep 2014 02:33:19 +0000 (08:03 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 9 Sep 2014 19:27:21 +0000 (15:27 -0400)
Currently, the interface count is maintained globally,
but this causes problems in RX filter calculation.
Make the interface count a per-channel-context variable
to fix this.

Signed-off-by: Sujith Manoharan <c_manoha@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/ath9k.h
drivers/net/wireless/ath/ath9k/beacon.c
drivers/net/wireless/ath/ath9k/debug.c
drivers/net/wireless/ath/ath9k/main.c
drivers/net/wireless/ath/ath9k/recv.c
drivers/net/wireless/ath/ath9k/tx99.c
drivers/net/wireless/ath/ath9k/wow.c

index 4f3da1835fed1b535c641fd475ccf2cdba9e3c2e..46a1d2e24dae5ce5967151c428cb4da4a4053ef5 100644 (file)
@@ -350,6 +350,7 @@ struct ath_chanctx {
        bool assigned;
        bool switch_after_beacon;
 
+       short nvifs;
        unsigned int rxfilter;
 };
 
@@ -963,7 +964,6 @@ struct ath_softc {
        bool ps_enabled;
        bool ps_idle;
        short nbcnvifs;
-       short nvifs;
        unsigned long ps_usecount;
 
        struct ath_rx rx;
index 83f2f2f2548ac6d049126e583882dedec70c385a..a6af855ef6ed9adb41e5a2c5d4ca90d197036c46 100644 (file)
@@ -183,7 +183,7 @@ static struct ath_buf *ath9k_beacon_generate(struct ieee80211_hw *hw,
        spin_unlock_bh(&cabq->axq_lock);
 
        if (skb && cabq_depth) {
-               if (sc->nvifs > 1) {
+               if (sc->cur_chan->nvifs > 1) {
                        ath_dbg(common, BEACON,
                                "Flushing previous cabq traffic\n");
                        ath_draintxq(sc, cabq);
index d2279365be6fcc6a85b2252a9c68a2502f94c211..5d8b5ea515b30a64248c49df6118fa1fe017c49b 100644 (file)
@@ -838,7 +838,7 @@ static ssize_t read_file_misc(struct file *file, char __user *user_buf,
                        iter_data.nmeshes, iter_data.nwds);
                len += scnprintf(buf + len, sizeof(buf) - len,
                        " ADHOC: %i TOTAL: %hi BEACON-VIF: %hi\n",
-                       iter_data.nadhocs, sc->nvifs, sc->nbcnvifs);
+                       iter_data.nadhocs, sc->cur_chan->nvifs, sc->nbcnvifs);
        }
 
        if (len > sizeof(buf))
index a2028590cf24176527067198b9d54877d85f7166..cdf1e7d41f075a74862de614757e43ad70f2887d 100644 (file)
@@ -1117,7 +1117,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
        mutex_lock(&sc->mutex);
 
        if (config_enabled(CONFIG_ATH9K_TX99)) {
-               if (sc->nvifs >= 1) {
+               if (sc->cur_chan->nvifs >= 1) {
                        mutex_unlock(&sc->mutex);
                        return -EOPNOTSUPP;
                }
@@ -1125,7 +1125,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
        }
 
        ath_dbg(common, CONFIG, "Attach a VIF of type: %d\n", vif->type);
-       sc->nvifs++;
+       sc->cur_chan->nvifs++;
 
        if (ath9k_uses_beacons(vif->type))
                ath9k_beacon_assign_slot(sc, vif);
@@ -1207,7 +1207,7 @@ static void ath9k_remove_interface(struct ieee80211_hw *hw,
 
        ath9k_p2p_remove_vif(sc, vif);
 
-       sc->nvifs--;
+       sc->cur_chan->nvifs--;
        sc->tx99_vif = NULL;
        if (!ath9k_is_chanctx_enabled())
                list_del(&avp->list);
index 68e56d66e55acf5c563d374acac9fb7a0675d98d..957a877242b559fb05635530e3152c89fd829c3a 100644 (file)
@@ -404,7 +404,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
                rfilt |= ATH9K_RX_FILTER_CONTROL;
 
        if ((sc->sc_ah->opmode == NL80211_IFTYPE_STATION) &&
-           (sc->nvifs <= 1) &&
+           (sc->cur_chan->nvifs <= 1) &&
            !(sc->cur_chan->rxfilter & FIF_BCN_PRBRESP_PROMISC))
                rfilt |= ATH9K_RX_FILTER_MYBEACON;
        else
@@ -417,7 +417,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc)
        if (sc->cur_chandef.width != NL80211_CHAN_WIDTH_20_NOHT)
                rfilt |= ATH9K_RX_FILTER_COMP_BAR;
 
-       if (sc->nvifs > 1 || (sc->cur_chan->rxfilter & FIF_OTHER_BSS)) {
+       if (sc->cur_chan->nvifs > 1 || (sc->cur_chan->rxfilter & FIF_OTHER_BSS)) {
                /* This is needed for older chips */
                if (sc->sc_ah->hw_version.macVersion <= AR_SREV_VERSION_9160)
                        rfilt |= ATH9K_RX_FILTER_PROM;
index 23972924c774becd09f633f0708159594bc1aae1..8a69d08ec55c574349dda86348c04e709c4debfe 100644 (file)
@@ -174,7 +174,7 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
        ssize_t len;
        int r;
 
-       if (sc->nvifs > 1)
+       if (sc->cur_chan->nvifs > 1)
                return -EOPNOTSUPP;
 
        len = min(count, sizeof(buf) - 1);
index 33531d9a4d50cbee3530d260aedcc60f9df74bb7..5f30e580d94291e787aa87e572e51225ce7c67a1 100644 (file)
@@ -232,7 +232,7 @@ int ath9k_suspend(struct ieee80211_hw *hw,
                goto fail_wow;
        }
 
-       if (sc->nvifs > 1) {
+       if (sc->cur_chan->nvifs > 1) {
                ath_dbg(common, WOW, "WoW for multivif is not yet supported\n");
                ret = 1;
                goto fail_wow;