ath5k: allow AP and mesh mode to operate simultaneously
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>
This commit is contained in:
parent
804483e907
commit
da473b61ad
@ -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 */
|
||||
|
@ -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",
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user