123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- From: Chaitanya T K <chaitanya.mgit@gmail.com>
- Date: Mon, 27 Jun 2016 15:23:26 +0530
- Subject: [PATCH] mac80211: minstrel: Enable STBC and LDPC for VHT Rates
- If peer support reception of STBC and LDPC, enable them for better
- performance.
- Signed-off-by: Chaitanya TK <chaitanya.mgit@gmail.com>
- ---
- --- a/include/linux/ieee80211.h
- +++ b/include/linux/ieee80211.h
- @@ -1551,6 +1551,7 @@ struct ieee80211_vht_operation {
- #define IEEE80211_VHT_CAP_RXSTBC_3 0x00000300
- #define IEEE80211_VHT_CAP_RXSTBC_4 0x00000400
- #define IEEE80211_VHT_CAP_RXSTBC_MASK 0x00000700
- +#define IEEE80211_VHT_CAP_RXSTBC_SHIFT 8
- #define IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE 0x00000800
- #define IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE 0x00001000
- #define IEEE80211_VHT_CAP_BEAMFORMEE_STS_SHIFT 13
- --- a/net/mac80211/rc80211_minstrel_ht.c
- +++ b/net/mac80211/rc80211_minstrel_ht.c
- @@ -1166,13 +1166,14 @@ minstrel_ht_update_caps(void *priv, stru
- struct minstrel_ht_sta_priv *msp = priv_sta;
- struct minstrel_ht_sta *mi = &msp->ht;
- struct ieee80211_mcs_info *mcs = &sta->ht_cap.mcs;
- - u16 sta_cap = sta->ht_cap.cap;
- + u16 ht_cap = sta->ht_cap.cap;
- struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
- int use_vht;
- int n_supported = 0;
- int ack_dur;
- int stbc;
- int i;
- + bool ldpc = false;
-
- /* fall back to the old minstrel for legacy stations */
- if (!sta->ht_cap.ht_supported)
- @@ -1210,16 +1211,24 @@ minstrel_ht_update_caps(void *priv, stru
- }
- mi->sample_tries = 4;
-
- - /* TODO tx_flags for vht - ATM the RC API is not fine-grained enough */
- if (!use_vht) {
- - stbc = (sta_cap & IEEE80211_HT_CAP_RX_STBC) >>
- + stbc = (ht_cap & IEEE80211_HT_CAP_RX_STBC) >>
- IEEE80211_HT_CAP_RX_STBC_SHIFT;
- - mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT;
-
- - if (sta_cap & IEEE80211_HT_CAP_LDPC_CODING)
- - mi->tx_flags |= IEEE80211_TX_CTL_LDPC;
- + if (ht_cap & IEEE80211_HT_CAP_LDPC_CODING)
- + ldpc = true;
- + } else {
- + stbc = (vht_cap->cap & IEEE80211_VHT_CAP_RXSTBC_MASK) >>
- + IEEE80211_VHT_CAP_RXSTBC_SHIFT;
- +
- + if (vht_cap->cap & IEEE80211_VHT_CAP_RXLDPC)
- + ldpc = true;
- }
-
- + mi->tx_flags |= stbc << IEEE80211_TX_CTL_STBC_SHIFT;
- + if (ldpc)
- + mi->tx_flags |= IEEE80211_TX_CTL_LDPC;
- +
- for (i = 0; i < ARRAY_SIZE(mi->groups); i++) {
- u32 gflags = minstrel_mcs_groups[i].flags;
- int bw, nss;
- @@ -1232,10 +1241,10 @@ minstrel_ht_update_caps(void *priv, stru
-
- if (gflags & IEEE80211_TX_RC_SHORT_GI) {
- if (gflags & IEEE80211_TX_RC_40_MHZ_WIDTH) {
- - if (!(sta_cap & IEEE80211_HT_CAP_SGI_40))
- + if (!(ht_cap & IEEE80211_HT_CAP_SGI_40))
- continue;
- } else {
- - if (!(sta_cap & IEEE80211_HT_CAP_SGI_20))
- + if (!(ht_cap & IEEE80211_HT_CAP_SGI_20))
- continue;
- }
- }
|