|
@@ -34,9 +34,28 @@ void ieee80211_ht_cap_ie_to_sta_ht_cap(struct ieee80211_supported_band *sband,
|
|
|
|
|
|
ht_cap->ht_supported = true;
|
|
|
|
|
|
- ht_cap->cap = le16_to_cpu(ht_cap_ie->cap_info) & sband->ht_cap.cap;
|
|
|
- ht_cap->cap &= ~IEEE80211_HT_CAP_SM_PS;
|
|
|
- ht_cap->cap |= sband->ht_cap.cap & IEEE80211_HT_CAP_SM_PS;
|
|
|
+ /*
|
|
|
+ * The bits listed in this expression should be
|
|
|
+ * the same for the peer and us, if the station
|
|
|
+ * advertises more then we can't use those thus
|
|
|
+ * we mask them out.
|
|
|
+ */
|
|
|
+ ht_cap->cap = le16_to_cpu(ht_cap_ie->cap_info) &
|
|
|
+ (sband->ht_cap.cap |
|
|
|
+ ~(IEEE80211_HT_CAP_LDPC_CODING |
|
|
|
+ IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
|
|
|
+ IEEE80211_HT_CAP_GRN_FLD |
|
|
|
+ IEEE80211_HT_CAP_SGI_20 |
|
|
|
+ IEEE80211_HT_CAP_SGI_40 |
|
|
|
+ IEEE80211_HT_CAP_DSSSCCK40));
|
|
|
+ /*
|
|
|
+ * The STBC bits are asymmetric -- if we don't have
|
|
|
+ * TX then mask out the peer's RX and vice versa.
|
|
|
+ */
|
|
|
+ if (!(sband->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC))
|
|
|
+ ht_cap->cap &= ~IEEE80211_HT_CAP_RX_STBC;
|
|
|
+ if (!(sband->ht_cap.cap & IEEE80211_HT_CAP_RX_STBC))
|
|
|
+ ht_cap->cap &= ~IEEE80211_HT_CAP_TX_STBC;
|
|
|
|
|
|
ampdu_info = ht_cap_ie->ampdu_params_info;
|
|
|
ht_cap->ampdu_factor =
|