From 857ed7b676a241ad304166d2a7c7cdb7a2e58da6 Mon Sep 17 00:00:00 2001
From: Felix Fietkau <nbd@openwrt.org>
Date: Sun, 18 Apr 2010 00:56:38 +0000
Subject: ath9k: add stbc support

SVN-Revision: 20976
---
 .../patches/565-mac80211_rx_stbc_define.patch      | 29 +++++++++++
 .../mac80211/patches/566-ath9k_stbc_support.patch  | 57 ++++++++++++++++++++++
 .../patches/567-ath9k_rc_stbc_support.patch        | 13 +++++
 3 files changed, 99 insertions(+)
 create mode 100644 package/mac80211/patches/565-mac80211_rx_stbc_define.patch
 create mode 100644 package/mac80211/patches/566-ath9k_stbc_support.patch
 create mode 100644 package/mac80211/patches/567-ath9k_rc_stbc_support.patch

(limited to 'package/mac80211')

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 0000000000..9202708d44
--- /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 0000000000..b403377b5d
--- /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 0000000000..4a4b099ce4
--- /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 */
-- 
cgit v1.2.3