Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b632fe8 authored by Stanislaw Gruszka's avatar Stanislaw Gruszka Committed by Johannes Berg
Browse files

mac80211: introduce IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL

Commit f0425bed "mac80211: retry sending
failed BAR frames later instead of tearing down aggr" caused regression
on rt2x00 hardware (connection hangs). This regression was fixed by
commit be03d4a4 "rt2x00: Don't let
mac80211 send a BAR when an AMPDU subframe fails". But the latter
commit caused yet another problem reported in
https://bugzilla.kernel.org/show_bug.cgi?id=42828#c22

After long discussion in this thread:
http://mid.gmane.org/20121018075615.GA18212@redhat.com


and testing various alternative solutions, which failed on one or other
setup, we have no other good fix for the issues like just revert both
mentioned earlier commits.

To do not affect other hardware which benefit from commit
f0425bed, instead of reverting it,
introduce flag that when used will restore mac80211 behaviour before
the commit.

Cc: stable@vger.kernel.org
Signed-off-by: default avatarStanislaw Gruszka <sgruszka@redhat.com>
[replaced link with mid.gmane.org that has message-id]
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent b98ea058
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1369,6 +1369,10 @@ struct ieee80211_tx_control {
 * @IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF: Use the P2P Device address for any
 *	P2P Interface. This will be honoured even if more than one interface
 *	is supported.
 *
 * @IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL: On this hardware TX BA session
 *	should be tear down once BAR frame will not be acked.
 *
 */
enum ieee80211_hw_flags {
	IEEE80211_HW_HAS_RATE_CONTROL			= 1<<0,
@@ -1397,6 +1401,7 @@ enum ieee80211_hw_flags {
	IEEE80211_HW_TX_AMPDU_SETUP_IN_HW		= 1<<23,
	IEEE80211_HW_SCAN_WHILE_IDLE			= 1<<24,
	IEEE80211_HW_P2P_DEV_ADDR_FOR_INTF		= 1<<25,
	IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL		= 1<<26,
};

/**
+5 −1
Original line number Diff line number Diff line
@@ -502,6 +502,10 @@ void ieee80211_tx_status(struct ieee80211_hw *hw, struct sk_buff *skb)
				       IEEE80211_BAR_CTRL_TID_INFO_MASK) >>
				      IEEE80211_BAR_CTRL_TID_INFO_SHIFT;

				if (local->hw.flags &
				    IEEE80211_HW_TEARDOWN_AGGR_ON_BAR_FAIL)
					ieee80211_stop_tx_ba_session(&sta->sta, tid);
				else
					ieee80211_set_bar_pending(sta, tid, ssn);
			}
		}