mac80211: fix a crash in minstrel_ht in HT mode with no supported MCS rates
[linux-flexiantxendom0-natty.git] / net / mac80211 / rc80211_minstrel_ht.c
index 165a451..cac35ff 100644 (file)
@@ -639,18 +639,14 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
        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);
@@ -705,7 +701,22 @@ minstrel_ht_update_caps(void *priv, struct ieee80211_supported_band *sband,
 
                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