From fe26803dd26a4fa446da62ea34065db642c0cdf9 Mon Sep 17 00:00:00 2001 From: Felix Fietkau Date: Fri, 25 Mar 2011 14:03:00 +0000 Subject: [PATCH] mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates connects (backport of r26287) SVN-Revision: 26289 --- .../583-mac80211_fix_minstrel_ht_crash.patch | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 package/mac80211/patches/583-mac80211_fix_minstrel_ht_crash.patch diff --git a/package/mac80211/patches/583-mac80211_fix_minstrel_ht_crash.patch b/package/mac80211/patches/583-mac80211_fix_minstrel_ht_crash.patch new file mode 100644 index 0000000000..90da583bf6 --- /dev/null +++ b/package/mac80211/patches/583-mac80211_fix_minstrel_ht_crash.patch @@ -0,0 +1,47 @@ +--- a/net/mac80211/rc80211_minstrel_ht.c ++++ b/net/mac80211/rc80211_minstrel_ht.c +@@ -634,18 +634,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); +@@ -700,7 +696,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 -- 2.30.2