mirror of https://github.com/hak5/openwrt-owl.git
parent
2f366cb4bd
commit
857ed7b676
|
@ -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),
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
|
@ -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 */
|
Loading…
Reference in New Issue