aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/iface.c
diff options
context:
space:
mode:
authorMichal Kazior <michal.kazior@tieto.com>2014-09-02 08:05:10 -0400
committerJohannes Berg <johannes.berg@intel.com>2014-09-03 07:40:38 -0400
commit4549cf2b1803d29cfd019f7bfeaa784f8f9c558f (patch)
treebf39255e299b752cea30ce8437b9a685b189e5d4 /net/mac80211/iface.c
parentd0616613d9cf17919fbd46fa0274db4b0084ad62 (diff)
mac80211: fix offloaded BA session traffic after hw restart
When starting an offloaded BA session it is unknown what starting sequence number should be used. Using last_seq worked in most cases except after hw restart. When hw restart is requested last_seq is (rightfully so) kept unmodified. This ended up with BA sessions being restarted with an aribtrary BA window values resulting in dropped frames until sequence numbers caught up. Instead of last_seq pick seqno of a first Rxed frame of a given BA session. This fixes stalled traffic after hw restart with offloaded BA sessions (currently only ath10k). Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r--net/mac80211/iface.c14
1 files changed, 3 insertions, 11 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c
index 01eede7406a5..bb7288e3c41c 100644
--- a/net/mac80211/iface.c
+++ b/net/mac80211/iface.c
@@ -1172,19 +1172,11 @@ static void ieee80211_iface_work(struct work_struct *work)
1172 rx_agg = (void *)&skb->cb; 1172 rx_agg = (void *)&skb->cb;
1173 mutex_lock(&local->sta_mtx); 1173 mutex_lock(&local->sta_mtx);
1174 sta = sta_info_get_bss(sdata, rx_agg->addr); 1174 sta = sta_info_get_bss(sdata, rx_agg->addr);
1175 if (sta) { 1175 if (sta)
1176 u16 last_seq;
1177
1178 last_seq = le16_to_cpu(
1179 sta->last_seq_ctrl[rx_agg->tid]);
1180
1181 __ieee80211_start_rx_ba_session(sta, 1176 __ieee80211_start_rx_ba_session(sta,
1182 0, 0, 1177 0, 0, 0, 1, rx_agg->tid,
1183 ieee80211_sn_inc(last_seq),
1184 1, rx_agg->tid,
1185 IEEE80211_MAX_AMPDU_BUF, 1178 IEEE80211_MAX_AMPDU_BUF,
1186 false); 1179 false, true);
1187 }
1188 mutex_unlock(&local->sta_mtx); 1180 mutex_unlock(&local->sta_mtx);
1189 } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_STOP) { 1181 } else if (skb->pkt_type == IEEE80211_SDATA_QUEUE_RX_AGG_STOP) {
1190 rx_agg = (void *)&skb->cb; 1182 rx_agg = (void *)&skb->cb;