tree-wide: replace config_enabled() with IS_ENABLED()
[deliverable/linux.git] / drivers / net / wireless / ath / ath9k / main.c
index 8b6398850657f014dd47252e1f124e8d823f99b8..a394622c9022c09488c59a85b878021c7c7b11a0 100644 (file)
@@ -910,6 +910,22 @@ static bool ath9k_uses_beacons(int type)
        }
 }
 
+static void ath9k_vif_iter_set_beacon(struct ath9k_vif_iter_data *iter_data,
+                                     struct ieee80211_vif *vif)
+{
+       /* Use the first (configured) interface, but prefering AP interfaces. */
+       if (!iter_data->primary_beacon_vif) {
+               iter_data->primary_beacon_vif = vif;
+       } else {
+               if (iter_data->primary_beacon_vif->type != NL80211_IFTYPE_AP &&
+                   vif->type == NL80211_IFTYPE_AP)
+               iter_data->primary_beacon_vif = vif;
+       }
+
+       iter_data->beacons = true;
+       iter_data->nbcnvifs += 1;
+}
+
 static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
                           u8 *mac, struct ieee80211_vif *vif)
 {
@@ -926,11 +942,13 @@ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
        }
 
        if (!vif->bss_conf.use_short_slot)
-               iter_data->slottime = ATH9K_SLOT_TIME_20;
+               iter_data->slottime = 20;
 
        switch (vif->type) {
        case NL80211_IFTYPE_AP:
                iter_data->naps++;
+               if (vif->bss_conf.enable_beacon)
+                       ath9k_vif_iter_set_beacon(iter_data, vif);
                break;
        case NL80211_IFTYPE_STATION:
                iter_data->nstations++;
@@ -943,12 +961,12 @@ static void ath9k_vif_iter(struct ath9k_vif_iter_data *iter_data,
        case NL80211_IFTYPE_ADHOC:
                iter_data->nadhocs++;
                if (vif->bss_conf.enable_beacon)
-                       iter_data->beacons = true;
+                       ath9k_vif_iter_set_beacon(iter_data, vif);
                break;
        case NL80211_IFTYPE_MESH_POINT:
                iter_data->nmeshes++;
                if (vif->bss_conf.enable_beacon)
-                       iter_data->beacons = true;
+                       ath9k_vif_iter_set_beacon(iter_data, vif);
                break;
        case NL80211_IFTYPE_WDS:
                iter_data->nwds++;
@@ -999,7 +1017,7 @@ void ath9k_calculate_iter_data(struct ath_softc *sc,
         */
        memset(iter_data, 0, sizeof(*iter_data));
        eth_broadcast_addr(iter_data->mask);
-       iter_data->slottime = ATH9K_SLOT_TIME_9;
+       iter_data->slottime = 9;
 
        list_for_each_entry(avp, &ctx->vifs, list)
                ath9k_vif_iter(iter_data, avp->vif->addr, avp->vif);
@@ -1061,7 +1079,7 @@ static void ath9k_set_offchannel_state(struct ath_softc *sc)
        ah->opmode = vif->type;
        ah->imask &= ~ATH9K_INT_SWBA;
        ah->imask &= ~ATH9K_INT_TSFOOR;
-       ah->slottime = ATH9K_SLOT_TIME_9;
+       ah->slottime = 9;
 
        ath_hw_setbssidmask(common);
        ath9k_hw_setopmode(ah);
@@ -1081,7 +1099,6 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
        struct ath_hw *ah = sc->sc_ah;
        struct ath_common *common = ath9k_hw_common(ah);
        struct ath9k_vif_iter_data iter_data;
-       struct ath_beacon_config *cur_conf;
 
        ath_chanctx_check_active(sc, ctx);
 
@@ -1103,13 +1120,12 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
        ath_hw_setbssidmask(common);
 
        if (iter_data.naps > 0) {
-               cur_conf = &ctx->beacon;
                ath9k_hw_set_tsfadjust(ah, true);
                ah->opmode = NL80211_IFTYPE_AP;
-               if (cur_conf->enable_beacon)
-                       iter_data.beacons = true;
        } else {
                ath9k_hw_set_tsfadjust(ah, false);
+               if (iter_data.beacons)
+                       ath9k_beacon_ensure_primary_slot(sc);
 
                if (iter_data.nmeshes)
                        ah->opmode = NL80211_IFTYPE_MESH_POINT;
@@ -1134,7 +1150,6 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
                        ctx->switch_after_beacon = true;
        }
 
-       ah->imask &= ~ATH9K_INT_SWBA;
        if (ah->opmode == NL80211_IFTYPE_STATION) {
                bool changed = (iter_data.primary_sta != ctx->primary_sta);
 
@@ -1151,16 +1166,12 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
                        if (ath9k_hw_mci_is_enabled(sc->sc_ah))
                                ath9k_mci_update_wlan_channels(sc, true);
                }
-       } else if (iter_data.beacons) {
-               ah->imask |= ATH9K_INT_SWBA;
        }
+       sc->nbcnvifs = iter_data.nbcnvifs;
+       ath9k_beacon_config(sc, iter_data.primary_beacon_vif,
+                           iter_data.beacons);
        ath9k_hw_set_interrupts(ah);
 
-       if (iter_data.beacons)
-               set_bit(ATH_OP_BEACONS, &common->op_flags);
-       else
-               clear_bit(ATH_OP_BEACONS, &common->op_flags);
-
        if (ah->slottime != iter_data.slottime) {
                ah->slottime = iter_data.slottime;
                ath9k_hw_init_global_settings(ah);
@@ -1239,7 +1250,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw,
 
        mutex_lock(&sc->mutex);
 
-       if (config_enabled(CONFIG_ATH9K_TX99)) {
+       if (IS_ENABLED(CONFIG_ATH9K_TX99)) {
                if (sc->cur_chan->nvifs >= 1) {
                        mutex_unlock(&sc->mutex);
                        return -EOPNOTSUPP;
@@ -1289,7 +1300,7 @@ static int ath9k_change_interface(struct ieee80211_hw *hw,
 
        mutex_lock(&sc->mutex);
 
-       if (config_enabled(CONFIG_ATH9K_TX99)) {
+       if (IS_ENABLED(CONFIG_ATH9K_TX99)) {
                mutex_unlock(&sc->mutex);
                return -EOPNOTSUPP;
        }
@@ -1349,7 +1360,7 @@ static void ath9k_enable_ps(struct ath_softc *sc)
        struct ath_hw *ah = sc->sc_ah;
        struct ath_common *common = ath9k_hw_common(ah);
 
-       if (config_enabled(CONFIG_ATH9K_TX99))
+       if (IS_ENABLED(CONFIG_ATH9K_TX99))
                return;
 
        sc->ps_enabled = true;
@@ -1368,7 +1379,7 @@ static void ath9k_disable_ps(struct ath_softc *sc)
        struct ath_hw *ah = sc->sc_ah;
        struct ath_common *common = ath9k_hw_common(ah);
 
-       if (config_enabled(CONFIG_ATH9K_TX99))
+       if (IS_ENABLED(CONFIG_ATH9K_TX99))
                return;
 
        sc->ps_enabled = false;
@@ -1777,9 +1788,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
        if ((changed & BSS_CHANGED_BEACON_ENABLED) ||
            (changed & BSS_CHANGED_BEACON_INT) ||
            (changed & BSS_CHANGED_BEACON_INFO)) {
-               ath9k_beacon_config(sc, vif, changed);
-               if (changed & BSS_CHANGED_BEACON_ENABLED)
-                       ath9k_calculate_summary_state(sc, avp->chanctx);
+               ath9k_calculate_summary_state(sc, avp->chanctx);
        }
 
        if ((avp->chanctx == sc->cur_chan) &&
@@ -1788,6 +1797,7 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
                        slottime = 9;
                else
                        slottime = 20;
+
                if (vif->type == NL80211_IFTYPE_AP) {
                        /*
                         * Defer update, so that connected stations can adjust
@@ -1823,11 +1833,19 @@ static void ath9k_bss_info_changed(struct ieee80211_hw *hw,
 static u64 ath9k_get_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
        struct ath_softc *sc = hw->priv;
+       struct ath_vif *avp = (void *)vif->drv_priv;
        u64 tsf;
 
        mutex_lock(&sc->mutex);
        ath9k_ps_wakeup(sc);
-       tsf = ath9k_hw_gettsf64(sc->sc_ah);
+       /* Get current TSF either from HW or kernel time. */
+       if (sc->cur_chan == avp->chanctx) {
+               tsf = ath9k_hw_gettsf64(sc->sc_ah);
+       } else {
+               tsf = sc->cur_chan->tsf_val +
+                     ath9k_hw_get_tsf_offset(&sc->cur_chan->tsf_ts, NULL);
+       }
+       tsf += le64_to_cpu(avp->tsf_adjust);
        ath9k_ps_restore(sc);
        mutex_unlock(&sc->mutex);
 
@@ -1839,10 +1857,15 @@ static void ath9k_set_tsf(struct ieee80211_hw *hw,
                          u64 tsf)
 {
        struct ath_softc *sc = hw->priv;
+       struct ath_vif *avp = (void *)vif->drv_priv;
 
        mutex_lock(&sc->mutex);
        ath9k_ps_wakeup(sc);
-       ath9k_hw_settsf64(sc->sc_ah, tsf);
+       tsf -= le64_to_cpu(avp->tsf_adjust);
+       getrawmonotonic(&avp->chanctx->tsf_ts);
+       if (sc->cur_chan == avp->chanctx)
+               ath9k_hw_settsf64(sc->sc_ah, tsf);
+       avp->chanctx->tsf_val = tsf;
        ath9k_ps_restore(sc);
        mutex_unlock(&sc->mutex);
 }
@@ -1850,11 +1873,15 @@ static void ath9k_set_tsf(struct ieee80211_hw *hw,
 static void ath9k_reset_tsf(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
 {
        struct ath_softc *sc = hw->priv;
+       struct ath_vif *avp = (void *)vif->drv_priv;
 
        mutex_lock(&sc->mutex);
 
        ath9k_ps_wakeup(sc);
-       ath9k_hw_reset_tsf(sc->sc_ah);
+       getrawmonotonic(&avp->chanctx->tsf_ts);
+       if (sc->cur_chan == avp->chanctx)
+               ath9k_hw_reset_tsf(sc->sc_ah);
+       avp->chanctx->tsf_val = 0;
        ath9k_ps_restore(sc);
 
        mutex_unlock(&sc->mutex);
@@ -1926,7 +1953,7 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
        struct ieee80211_channel *chan;
        int pos;
 
-       if (config_enabled(CONFIG_ATH9K_TX99))
+       if (IS_ENABLED(CONFIG_ATH9K_TX99))
                return -EOPNOTSUPP;
 
        spin_lock_bh(&common->cc_lock);
@@ -1976,7 +2003,7 @@ static void ath9k_set_coverage_class(struct ieee80211_hw *hw,
        struct ath_softc *sc = hw->priv;
        struct ath_hw *ah = sc->sc_ah;
 
-       if (config_enabled(CONFIG_ATH9K_TX99))
+       if (IS_ENABLED(CONFIG_ATH9K_TX99))
                return;
 
        mutex_lock(&sc->mutex);
This page took 0.029774 seconds and 5 git commands to generate.