From 1526792622314377fac401bdacc7934b7ec8fc48 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 25 Mar 2011 14:00:59 +0000 Subject: [PATCH] mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates connects SVN-Revision: 26287 --- .../580-mac80211_fix_minstrel_ht_crash.patch | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 package/mac80211/patches/580-mac80211_fix_minstrel_ht_crash.patch 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 00000000000..942bf920860 --- /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