From: Felix Fietkau Date: Fri, 25 Mar 2011 14:00:59 +0000 (+0000) Subject: mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates... X-Git-Url: http://git.lede-project.org./?a=commitdiff_plain;h=1526792622314377fac401bdacc7934b7ec8fc48;p=openwrt%2Fstaging%2F981213.git mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates connects SVN-Revision: 26287 --- 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