aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath6kl/main.c
diff options
context:
space:
mode:
authorVasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com>2012-01-21 04:52:53 -0500
committerKalle Valo <kvalo@qca.qualcomm.com>2012-01-24 07:12:27 -0500
commit1d2a4456de20db73362c86c88fe9c02169f29d0a (patch)
tree3ecb864ad46a88bc7255a3431e4f446eb01a2829 /drivers/net/wireless/ath/ath6kl/main.c
parent3fdc099109e75359e5de54c56478c06255850741 (diff)
ath6kl: Fix bug in maintaining aggregation state in AP mode
Currently rx aggregation related states are maintained per vif, but this will not properly work when operating in AP mode. Aggregation is completely broken when more than one 11n stations are connected to AP mode vif. Fix this issue by keeping station specific aggregation state in sta_list. Signed-off-by: Vasanthakumar Thiagarajan <vthiagar@qca.qualcomm.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath6kl/main.c')
-rw-r--r--drivers/net/wireless/ath/ath6kl/main.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath6kl/main.c b/drivers/net/wireless/ath/ath6kl/main.c
index acb4acb71718..39da1f98da87 100644
--- a/drivers/net/wireless/ath/ath6kl/main.c
+++ b/drivers/net/wireless/ath/ath6kl/main.c
@@ -74,6 +74,7 @@ static void ath6kl_add_new_sta(struct ath6kl_vif *vif, u8 *mac, u16 aid,
74 74
75 ar->sta_list_index = ar->sta_list_index | (1 << free_slot); 75 ar->sta_list_index = ar->sta_list_index | (1 << free_slot);
76 ar->ap_stats.sta[free_slot].aid = cpu_to_le32(aid); 76 ar->ap_stats.sta[free_slot].aid = cpu_to_le32(aid);
77 aggr_conn_init(vif, sta->aggr_conn);
77} 78}
78 79
79static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i) 80static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
@@ -94,7 +95,7 @@ static void ath6kl_sta_cleanup(struct ath6kl *ar, u8 i)
94 sta->sta_flags = 0; 95 sta->sta_flags = 0;
95 96
96 ar->sta_list_index = ar->sta_list_index & ~(1 << i); 97 ar->sta_list_index = ar->sta_list_index & ~(1 << i);
97 98 aggr_reset_state(sta->aggr_conn);
98} 99}
99 100
100static u8 ath6kl_remove_sta(struct ath6kl *ar, u8 *mac, u16 reason) 101static u8 ath6kl_remove_sta(struct ath6kl *ar, u8 *mac, u16 reason)
@@ -602,7 +603,7 @@ void ath6kl_connect_event(struct ath6kl_vif *vif, u16 channel, u8 *bssid,
602 netif_carrier_on(vif->ndev); 603 netif_carrier_on(vif->ndev);
603 spin_unlock_bh(&vif->if_lock); 604 spin_unlock_bh(&vif->if_lock);
604 605
605 aggr_reset_state(vif->aggr_cntxt); 606 aggr_reset_state(vif->aggr_cntxt->aggr_conn);
606 vif->reconnect_flag = 0; 607 vif->reconnect_flag = 0;
607 608
608 if ((vif->nw_type == ADHOC_NETWORK) && ar->ibss_ps_enable) { 609 if ((vif->nw_type == ADHOC_NETWORK) && ar->ibss_ps_enable) {
@@ -924,7 +925,7 @@ void ath6kl_disconnect_event(struct ath6kl_vif *vif, u8 reason, u8 *bssid,
924 assoc_resp_len, assoc_info, 925 assoc_resp_len, assoc_info,
925 prot_reason_status); 926 prot_reason_status);
926 927
927 aggr_reset_state(vif->aggr_cntxt); 928 aggr_reset_state(vif->aggr_cntxt->aggr_conn);
928 929
929 del_timer(&vif->disconnect_timer); 930 del_timer(&vif->disconnect_timer);
930 931