mac80211: fix a deadlock in minstrel_ht when a HT client without valid MCS rates...
authornbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 25 Mar 2011 14:03:00 +0000 (14:03 +0000)
committernbd <nbd@3c298f89-4303-0410-b956-a3cf2f4a3e73>
Fri, 25 Mar 2011 14:03:00 +0000 (14:03 +0000)
git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@26289 3c298f89-4303-0410-b956-a3cf2f4a3e73

package/mac80211/patches/583-mac80211_fix_minstrel_ht_crash.patch [new file with mode: 0644]

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 (file)
index 0000000..90da583
--- /dev/null
@@ -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