diff options
3 files changed, 99 insertions, 0 deletions
diff --git a/package/mac80211/patches/565-mac80211_rx_stbc_define.patch b/package/mac80211/patches/565-mac80211_rx_stbc_define.patch new file mode 100644 index 000000000..9202708d4 --- /dev/null +++ b/package/mac80211/patches/565-mac80211_rx_stbc_define.patch @@ -0,0 +1,29 @@ +--- a/include/linux/ieee80211.h ++++ b/include/linux/ieee80211.h +@@ -876,6 +876,7 @@ struct ieee80211_ht_cap { + #define IEEE80211_HT_CAP_SGI_40			0x0040 + #define IEEE80211_HT_CAP_TX_STBC		0x0080 + #define IEEE80211_HT_CAP_RX_STBC		0x0300 ++#define		IEEE80211_HT_CAP_RX_STBC_SHIFT	8 + #define IEEE80211_HT_CAP_DELAY_BA		0x0400 + #define IEEE80211_HT_CAP_MAX_AMSDU		0x0800 + #define IEEE80211_HT_CAP_DSSSCCK40		0x1000 +--- a/include/net/mac80211.h ++++ b/include/net/mac80211.h +@@ -275,6 +275,8 @@ struct ieee80211_bss_conf { +  *	MLME command (internal to mac80211 to figure out whether to send TX +  *	status to user space) +  * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame ++ * @IEEE80211_TX_CTL_STBC: tells the driver to use Space-Time Block Coding ++ *  (STBC) for this frame. +  */ + enum mac80211_tx_control_flags { + 	IEEE80211_TX_CTL_REQ_TX_STATUS		= BIT(0), +@@ -299,6 +301,7 @@ enum mac80211_tx_control_flags { + 	IEEE80211_TX_INTFL_HAS_RADIOTAP		= BIT(20), + 	IEEE80211_TX_INTFL_NL80211_FRAME_TX	= BIT(21), + 	IEEE80211_TX_CTL_LDPC			= BIT(22), ++	IEEE80211_TX_CTL_STBC			= BIT(23), + }; +  + /** diff --git a/package/mac80211/patches/566-ath9k_stbc_support.patch b/package/mac80211/patches/566-ath9k_stbc_support.patch new file mode 100644 index 000000000..b403377b5 --- /dev/null +++ b/package/mac80211/patches/566-ath9k_stbc_support.patch @@ -0,0 +1,57 @@ +--- a/drivers/net/wireless/ath/ath9k/init.c ++++ b/drivers/net/wireless/ath/ath9k/init.c +@@ -217,6 +217,12 @@ static void setup_ht_cap(struct ath_soft + 	else + 		max_streams = 2; +  ++	if (AR_SREV_9280_10_OR_LATER(ah)) { ++		if (max_streams >= 2) ++			ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; ++		ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT); ++	} ++ + 	/* set up supported mcs set */ + 	memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); + 	tx_streams = count_streams(common->tx_chainmask, max_streams); +--- a/drivers/net/wireless/ath/ath9k/mac.h ++++ b/drivers/net/wireless/ath/ath9k/mac.h +@@ -37,6 +37,8 @@ + 	  AR_2040_##_index : 0)						\ + 	 |((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ?	\ + 	   AR_GI##_index : 0)						\ ++	 |((_series)[_index].RateFlags & ATH9K_RATESERIES_STBC ?	\ ++	   AR_STBC##_index : 0)						\ + 	 |SM((_series)[_index].ChSel, AR_ChainSel##_index)) +  + #define CCK_SIFS_TIME        10 +@@ -434,7 +436,10 @@ struct ar5416_desc { + #define AR_ChainSel3_S      17 + #define AR_RTSCTSRate       0x0ff00000 + #define AR_RTSCTSRate_S     20 +-#define AR_TxCtlRsvd70      0xf0000000 ++#define AR_STBC0            0x10000000 ++#define AR_STBC1            0x20000000 ++#define AR_STBC2            0x40000000 ++#define AR_STBC3            0x80000000 +  + #define AR_TxRSSIAnt00      0x000000ff + #define AR_TxRSSIAnt00_S    0 +@@ -647,6 +652,7 @@ enum ath9k_rx_filter { + #define ATH9K_RATESERIES_RTS_CTS  0x0001 + #define ATH9K_RATESERIES_2040     0x0002 + #define ATH9K_RATESERIES_HALFGI   0x0004 ++#define ATH9K_RATESERIES_STBC     0x0008 +  + struct ath9k_11n_rate_series { + 	u32 Tries; +--- a/drivers/net/wireless/ath/ath9k/xmit.c ++++ b/drivers/net/wireless/ath/ath9k/xmit.c +@@ -1607,6 +1607,8 @@ static void ath_buf_set_rate(struct ath_ + 			series[i].Rate = rix | 0x80; + 			series[i].PktDuration = ath_pkt_duration(sc, rix, bf, + 				 is_40, is_sgi, is_sp); ++			if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) ++				series[i].RateFlags |= ATH9K_RATESERIES_STBC; + 			continue; + 		} +  diff --git a/package/mac80211/patches/567-ath9k_rc_stbc_support.patch b/package/mac80211/patches/567-ath9k_rc_stbc_support.patch new file mode 100644 index 000000000..4a4b099ce --- /dev/null +++ b/package/mac80211/patches/567-ath9k_rc_stbc_support.patch @@ -0,0 +1,13 @@ +--- a/drivers/net/wireless/ath/ath9k/rc.c ++++ b/drivers/net/wireless/ath/ath9k/rc.c +@@ -700,6 +700,10 @@ static void ath_get_rate(void *priv, str + 	    (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)) + 		tx_info->flags |= IEEE80211_TX_CTL_LDPC; +  ++	if (conf_is_ht(&sc->hw->conf) && ++	    (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)) ++		tx_info->flags |= IEEE80211_TX_CTL_STBC; ++ + 	if (is_probe) { + 		/* set one try for probe rates. For the + 		 * probes don't enable rts */  | 
