mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			83 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
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
 | 
						|
@@ -1556,6 +1556,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
 | 
						|
@@ -1130,7 +1130,7 @@ 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;
 | 
						|
 	struct sta_info *sinfo = container_of(sta, struct sta_info, sta);
 | 
						|
 	int use_vht;
 | 
						|
@@ -1138,6 +1138,7 @@ minstrel_ht_update_caps(void *priv, stru
 | 
						|
 	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)
 | 
						|
@@ -1175,16 +1176,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;
 | 
						|
@@ -1197,10 +1206,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;
 | 
						|
 			}
 | 
						|
 		}
 |