void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
 void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
 void ath9k_set_beacon(struct ath_softc *sc);
-bool ath9k_csa_is_finished(struct ath_softc *sc);
+bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif);
+void ath9k_csa_update(struct ath_softc *sc);
 
 /*******************/
 /* Link Monitoring */
 #endif
 
        struct ath_descdma txsdma;
-       struct ieee80211_vif *csa_vif;
 
        struct ath_ant_comb ant_comb;
        u8 ant_tx, ant_rx;
 
                (unsigned long long)tsfadjust, avp->av_bslot);
 }
 
-bool ath9k_csa_is_finished(struct ath_softc *sc)
+bool ath9k_csa_is_finished(struct ath_softc *sc, struct ieee80211_vif *vif)
 {
-       struct ieee80211_vif *vif;
-
-       vif = sc->csa_vif;
        if (!vif || !vif->csa_active)
                return false;
 
                return false;
 
        ieee80211_csa_finish(vif);
-
-       sc->csa_vif = NULL;
        return true;
 }
 
+static void ath9k_csa_update_vif(void *data, u8 *mac, struct ieee80211_vif *vif)
+{
+       struct ath_softc *sc = data;
+       ath9k_csa_is_finished(sc, vif);
+}
+
+void ath9k_csa_update(struct ath_softc *sc)
+{
+       ieee80211_iterate_active_interfaces(sc->hw,
+                                           IEEE80211_IFACE_ITER_NORMAL,
+                                           ath9k_csa_update_vif,
+                                           sc);
+}
+
 void ath9k_beacon_tasklet(unsigned long data)
 {
        struct ath_softc *sc = (struct ath_softc *)data;
                return;
        }
 
-       /* EDMA devices check that in the tx completion function. */
-       if (!edma && ath9k_csa_is_finished(sc))
-               return;
-
        slot = ath9k_beacon_choose_slot(sc);
        vif = sc->beacon.bslot[slot];
 
+       /* EDMA devices check that in the tx completion function. */
+       if (!edma && ath9k_csa_is_finished(sc, vif))
+               return;
+
        if (!vif || !vif->bss_conf.enable_beacon)
                return;
 
 
        if (ath9k_uses_beacons(vif->type))
                ath9k_beacon_remove_slot(sc, vif);
 
-       if (sc->csa_vif == vif)
-               sc->csa_vif = NULL;
-
        ath9k_ps_wakeup(sc);
        ath9k_calculate_summary_state(hw, NULL);
        ath9k_ps_restore(sc);
                                        struct ieee80211_vif *vif,
                                        struct cfg80211_chan_def *chandef)
 {
-       struct ath_softc *sc = hw->priv;
-
-       /* mac80211 does not support CSA in multi-if cases (yet) */
-       if (WARN_ON(sc->csa_vif))
-               return;
-
-       sc->csa_vif = vif;
+       /* depend on vif->csa_active only */
+       return;
 }
 
 struct ieee80211_ops ath9k_ops = {