ath5k: allow AP and mesh mode to operate simultaneously
authorChun-Yeow Yeoh <yeohchunyeow@gmail.com>
Sat, 3 Mar 2012 01:48:56 +0000 (09:48 +0800)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 6 Mar 2012 20:16:05 +0000 (15:16 -0500)
This patch allows the possibility of having the mesh point and AP to be operated
simultaneously in one single radio. Previously, mesh point fails to generate the
mesh beacon if virtual AP is created for the same radio.

Signed-off-by: Chun-Yeow Yeoh <yeohchunyeow@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath5k/ath5k.h
drivers/net/wireless/ath/ath5k/base.c
drivers/net/wireless/ath/ath5k/mac80211-ops.c

index 6640326f70056d1af8074eb90699316d20d156e8..8d434b8f58557ff8b105371fe012661b829367e4 100644 (file)
@@ -1320,6 +1320,7 @@ struct ath5k_hw {
        struct ieee80211_vif    *bslot[ATH_BCBUF];
        u16                     num_ap_vifs;
        u16                     num_adhoc_vifs;
+       u16                     num_mesh_vifs;
        unsigned int            bhalq,          /* SW q for outgoing beacons */
                                bmisscount,     /* missed beacon transmits */
                                bintval,        /* beacon interval in TU */
index a339693fbe265cfc475f097d70fb0c11dc29e0b0..b51d58c414d282a1172531e3fcc3fc07ab3c00ba 100644 (file)
@@ -1867,7 +1867,8 @@ ath5k_beacon_send(struct ath5k_hw *ah)
                ah->bmisscount = 0;
        }
 
-       if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs > 1) ||
+       if ((ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs +
+                       ah->num_mesh_vifs > 1) ||
                        ah->opmode == NL80211_IFTYPE_MESH_POINT) {
                u64 tsf = ath5k_hw_get_tsf64(ah);
                u32 tsftu = TSF_TO_TU(tsf);
@@ -1952,7 +1953,8 @@ ath5k_beacon_update_timers(struct ath5k_hw *ah, u64 bc_tsf)
        u64 hw_tsf;
 
        intval = ah->bintval & AR5K_BEACON_PERIOD;
-       if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs > 1) {
+       if (ah->opmode == NL80211_IFTYPE_AP && ah->num_ap_vifs
+               + ah->num_mesh_vifs > 1) {
                intval /= ATH_BCBUF;    /* staggered multi-bss beacons */
                if (intval < 15)
                        ATH5K_WARN(ah, "intval %u is too low, min 15\n",
index af4c7ecb4b303a6595413339de28473677ac135a..5c5329955414966247d5f44dcb8d7760e2d474f1 100644 (file)
@@ -134,6 +134,8 @@ ath5k_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)
                        ah->num_ap_vifs++;
                else if (avf->opmode == NL80211_IFTYPE_ADHOC)
                        ah->num_adhoc_vifs++;
+               else if (avf->opmode == NL80211_IFTYPE_MESH_POINT)
+                       ah->num_mesh_vifs++;
        }
 
        /* Any MAC address is fine, all others are included through the
@@ -175,6 +177,8 @@ ath5k_remove_interface(struct ieee80211_hw *hw,
                ah->num_ap_vifs--;
        else if (avf->opmode == NL80211_IFTYPE_ADHOC)
                ah->num_adhoc_vifs--;
+       else if (avf->opmode == NL80211_IFTYPE_MESH_POINT)
+               ah->num_mesh_vifs--;
 
        ath5k_update_bssid_mask_and_opmode(ah, NULL);
        mutex_unlock(&ah->lock);