aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFelix Fietkau <nbd@openwrt.org>2011-03-25 14:00:59 +0000
committerFelix Fietkau <nbd@openwrt.org>2011-03-25 14:00:59 +0000
commitb8509c155d9d5b7e65a7f109b8e9c0f88372974b (patch)
tree8f0efb1d9e8c1dab37047e277b11f22a04aea733
parent8ad00cd33067856a57bddc58a9d8c861517edafd (diff)
downloadupstream-b8509c155d9d5b7e65a7f109b8e9c0f88372974b.tar.gz
upstream-b8509c155d9d5b7e65a7f109b8e9c0f88372974b.tar.bz2
upstream-b8509c155d9d5b7e65a7f109b8e9c0f88372974b.zip
mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates connects
git-svn-id: svn://svn.openwrt.org/openwrt/trunk@26287 3c298f89-4303-0410-b956-a3cf2f4a3e73
-rw-r--r--package/mac80211/patches/580-mac80211_fix_minstrel_ht_crash.patch47
1 files changed, 47 insertions, 0 deletions
diff --git a/package/mac80211/patches/580-mac80211_fix_minstrel_ht_crash.patch b/package/mac80211/patches/580-mac80211_fix_minstrel_ht_crash.patch
new file mode 100644
index 0000000000..942bf92086
--- /dev/null
+++ b/package/mac80211/patches/580-mac80211_fix_minstrel_ht_crash.patch
@@ -0,0 +1,47 @@
+--- a/net/mac80211/rc80211_minstrel_ht.c
++++ b/net/mac80211/rc80211_minstrel_ht.c
+@@ -659,18 +659,14 @@ minstrel_ht_update_caps(void *priv, stru
+ struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
+ struct ieee80211_local *local = hw_to_local(mp->hw);
+ u16 sta_cap = sta->ht_cap.cap;
++ int n_supported = 0;
+ int ack_dur;
+ int stbc;
+ int i;
+
+ /* fall back to the old minstrel for legacy stations */
+- if (!sta->ht_cap.ht_supported) {
+- msp->is_ht = false;
+- memset(&msp->legacy, 0, sizeof(msp->legacy));
+- msp->legacy.r = msp->ratelist;
+- msp->legacy.sample_table = msp->sample_table;
+- return mac80211_minstrel.rate_init(priv, sband, sta, &msp->legacy);
+- }
++ if (!sta->ht_cap.ht_supported)
++ goto use_legacy;
+
+ BUILD_BUG_ON(ARRAY_SIZE(minstrel_mcs_groups) !=
+ MINSTREL_MAX_STREAMS * MINSTREL_STREAM_GROUPS);
+@@ -725,7 +721,22 @@ minstrel_ht_update_caps(void *priv, stru
+
+ mi->groups[i].supported =
+ mcs->rx_mask[minstrel_mcs_groups[i].streams - 1];
++
++ if (mi->groups[i].supported)
++ n_supported++;
+ }
++
++ if (!n_supported)
++ goto use_legacy;
++
++ return;
++
++use_legacy:
++ msp->is_ht = false;
++ memset(&msp->legacy, 0, sizeof(msp->legacy));
++ msp->legacy.r = msp->ratelist;
++ msp->legacy.sample_table = msp->sample_table;
++ return mac80211_minstrel.rate_init(priv, sband, sta, &msp->legacy);
+ }
+
+ static void